﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ControlsLib;
using GestionePolveriLib.BL;
using GestionePolveriLib.Facades;
using Be.Timvw.Framework.ComponentModel;
using GestionePolveri2.Reports;
using DGVPrinterHelper;
using BrightIdeasSoftware;
using FrameworkLib.Configurations.FormsConfiguration.BL;
using FrameworkLib.Configurations.FormsConfiguration;

namespace GestionePolveri2
{
    public partial class AnagraficaPolveri2 : AnagraficaPolveri2Base
    {
        public AnagraficaPolveri2()
        {
            InitializeComponent();
        }

        public override void InitializeForm()
        {
            System.Security.Principal.IPrincipal m_operatore = System.Threading.Thread.CurrentPrincipal;
            string[] roles = System.Web.Security.Roles.GetRolesForUser(m_operatore.Identity.Name);

            SavingConfigurationBag scb = new SavingConfigurationBag();
            scb.FormName = this.Name;
            scb.RoleName = roles[0];
            this.SavingConfigurationBag = scb;

            base.InitializeForm();

            if (!this.DesignMode)
            {
                //this.EnableSorting = true;

                this.ShowCNFGMenu = true;

                this.AddCustomButton("btnStampa", "Stampa");

                this.CanModify = true;
                this.AllowNormalButtonManagment = true;
                this.ButtonClicked += new EventHandler<CustomEventArgs<Polvere>>(Anagrafica_ButtonClicked);
                this.ItemSelected += new EventHandler<CustomEventArgs<Polvere>>(Anagrafica_ItemSelected);
                this.CustomButtonClicked += new EventHandler<CustomEventArgs<Polvere>>(Anagrafica_CustomButtonClicked);

                this.ShowFilterTracing = true;

                LoadFornitori(false);
                LoadTipologieSMP();

                LoadData();
            }
        }

        void Anagrafica_CustomButtonClicked(object sender, CustomEventArgs<Polvere> e)
        {
            if (e.ButtonName.Equals("btnStampa", StringComparison.InvariantCultureIgnoreCase))
            {
                // stampa usando un report...
                List<Polvere> data = new List<Polvere>();
                foreach (BrightIdeasSoftware.OLVListItem item in this.objectListView1.Items)
                {
                    data.Add((Polvere)item.RowObject);
                }

                ReportViewerDialog2 rpd2 = new ReportViewerDialog2();
                //rpd2.Datasource = this.dataGridView1.DataSource;
                rpd2.Datasource = data;
                rpd2.Report = "ElencoPolveri";
                rpd2.ReportViewer.PrinterSettings.DefaultPageSettings.Landscape = true;
                rpd2.ShowReport();

                // stampa usando la funzione della ObjectListView...
                //BrightIdeasSoftware.ListViewPrinter lvp = new ListViewPrinter();
                //lvp.ListView = this.objectListView1;
                //lvp.Header = "Anagrafica Polveri";
                //lvp.IsShrinkToFit = true;
                //lvp.PrintPreview();

                #region codice da cancellare...
                //if (base.Current == null) return;

                //DGVPrinter printer = new DGVPrinter();

                //printer.Title = "DataGridView Report";
                //printer.SubTitle = "An Easy to Use DataGridView Printing Object";
                //printer.SubTitleFormatFlags = StringFormatFlags.LineLimit | StringFormatFlags.NoClip;
                //printer.PageNumbers = true;
                //printer.PageNumberInHeader = false;
                //printer.PorportionalColumns = false;
                //printer.HeaderCellAlignment = StringAlignment.Near;
                //printer.Footer = "Your Company Name Here";
                //printer.FooterSpacing = 15;
                //printer.PageSettings.Landscape = true;

                //this.dataGridView1.Columns[0].Width = 50;
                //this.dataGridView1.Columns[1].Width = 80;
                //this.dataGridView1.Columns[2].Width = 80;
                //this.dataGridView1.Columns[3].Width = 80;
                //this.dataGridView1.Columns[4].Width = 80;
                //this.dataGridView1.Columns[5].Width = 80;
                //this.dataGridView1.Columns[6].Width = 10;
                //this.dataGridView1.Columns[7].Width = 50;

                //foreach (DataGridViewColumn col in this.dataGridView1.Columns)
                //{
                //    printer.ColumnStyles[col.Name] = this.dataGridView1.DefaultCellStyle.Clone();
                //    printer.ColumnStyles[col.Name].Font = new Font("Arial", 6);
                //}

                ////printer.PrintDataGridView(this.dataGridView1);


                //if (DialogResult.OK == printer.DisplayPrintDialog())  // replace DisplayPrintDialog() 
                //// with your own print dialog
                //{
                //    // print without displaying the printdialog
                //    printer.PrintNoDisplay(this.dataGridView1);
                //}




                //ReportViewerDialog rvd = new ReportViewerDialog();
                //rvd.Datasource = this.dataGridView1.DataSource;
                //rvd.Report = "Report51";
                //rvd.ShowReport();
                #endregion
            }
        }

        private void LoadFornitori(bool selectLast)
        {
            GestionePolveriLib.Utilities.FilterComboBoxHelper.SetupFornitoriComboBox(this.dynCmbFornitori);

            //FornitoriFacade fcf = new FornitoriFacade();
            //fcf.LoadAsync((result) =>
            //{
            //    ((List<Fornitore>)result).Insert(0, new Fornitore() { Descrizione="Selezionare un Fornitore...", ID=-1 });

            //    this.dynCmbFornitori.AutoCompleteSource = AutoCompleteSource.ListItems;
            //    this.dynCmbFornitori.DisplayMember = "Descrizione";
            //    this.dynCmbFornitori.ValueMember = "ID";
            //    this.dynCmbFornitori.DataSource = result;

            //    //if (selectLast)
            //    //{
            //    //    this.dataGridView1.Rows[this.dataGridView1.Rows.Count - 1].Selected = true;
            //    //}
            //});
        }

        private void LoadTipologieSMP()
        {
            GestionePolveriLib.Utilities.FilterComboBoxHelper.SetupTipologieSMPComboBox(this.dynCmbTipologiaSMP);
        }

        protected override void LoadData(GestionePolveriLib.BL.FilterBags.AnagraficaPolveriFilterBag filter)
        {
            base.LoadData(filter);

            PolvereFacade pf = new PolvereFacade();

            pf.RunAsync(() => pf.GetAll(filter), (result) =>
            {
                this.objectListView1.AddDecoration(new EditingCellBorderDecoration { UseLightbox = true });
                this.objectListView1.SetObjects((List<Polvere>)result, true);

                if (this.Current != null)
                {
                    int index = 0;
                    foreach (Polvere p in (List<Polvere>)this.objectListView1.Objects)
                    {
                        if (p.ID == this.Current.ID)
                        {
                            break;
                        }

                        index++;
                    }

                    this.SetGridItemSelected(index);
                }

                //this.Datasource = result;

                //if (selectLast)
                //{
                //    this.dataGridView1.Rows[this.dataGridView1.Rows.Count - 1].Selected = true;
                //}
            });
        }

        protected override void LoadData()
        {
            PolvereFacade pf = new PolvereFacade();

            pf.LoadAsync((result) =>
            {
                this.objectListView1.AddDecoration(new EditingCellBorderDecoration { UseLightbox = true });
                this.objectListView1.SetObjects((List<Polvere>)result, true);

                if (this.Current != null)
                {
                    int index = 0;
                    foreach (Polvere p in (List<Polvere>)this.objectListView1.Objects)
                    {
                        if (p.ID == this.Current.ID)
                        {
                            break;
                        }

                        index++;
                    }

                    this.SetGridItemSelected(index);
                }
            });
        }

        void Anagrafica_ButtonClicked(object sender, CustomEventArgs<Polvere> e)
        {
            PolvereFacade impf = new PolvereFacade();
            Polvere data = new Polvere();

            switch (e.Action)
            {
                case Actions.New:
                    {
                        base.ClearControls(this.Controls);
                    }
                    break;
                case Actions.Add:
                    {
                        if ((this.dynCmbFornitori.SelectedIndex == 0) || (this.dynCmbFornitori.SelectedIndex == -1))
                        {
                            MessageBox.Show("Fornitore non selezionato o sconosciuto.\n\rSelezionare un fornitore... !", "Gestione Polveri", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                            this.ButtonBar.CurrentAction = Actions.Add;
                            return;
                        }

                        if ((this.dynCmbTipologiaSMP.SelectedIndex == 0) || (this.dynCmbTipologiaSMP.SelectedIndex == -1))
                        {
                            MessageBox.Show("Tipologia Scorta Minima non indicata !", "Gestione Polveri", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                            this.ButtonBar.CurrentAction = Actions.Add;
                            return;
                        }

                        data.CodicePolvere = this.dynCodicePolvereTextBox.Text;
                        data.Descrizione = this.dynDescrizioneTextBox.Text;
                        data.Note = this.dynNoteTextBox.Text;
                        data.Fornitore = (Fornitore)this.dynCmbFornitori.SelectedValue;
                        data.ScortaMinima = (string.IsNullOrWhiteSpace(this.dynScortaMinima.Text) ? 0 : double.Parse(this.dynScortaMinima.Text));
                        data.IsCodiceCustom = dynChkIsCodiceCustom.Checked;
                        data.TipologiaSM = (TipologiaScortaMinima)dynCmbTipologiaSMP.SelectedValue;

                        if(data.IsCodiceCustom)
                        {
                            data.CodicePolvere = "XXXX " + data.CodicePolvere;
                        }

                        impf.Add(data);

                        // aggiungo alla FamigliaColoriXPolveri...
                        //FamiglieColoriXPolveri fcxp = null;
                        //FamiglieColoriXPolveriFacade fcxpf = new FamiglieColoriXPolveriFacade();
                        //fcxp = fcxpf.Get(data.ID);
                        //if (fcxp == null)
                        //{
                        //    fcxp = new FamiglieColoriXPolveri();

                        //    fcxp.IDPolvere = data.ID;
                        //    fcxp.Applicazione = data.Applicazione;
                        //    fcxp.Famiglie = 

                        //    fcxpf.Add(fcxp);
                        //}

                        base.ClearControls(this.Controls);
                        this.ButtonBar.ResetButtonBar();
                        LoadData();
                    }
                    break;
                case Actions.Modify:
                    {
                        if (this.dynCmbFornitori.SelectedIndex == 0)
                        {
                            MessageBox.Show("Fornitore non selezionato o sconosciuto.\n\rSelezionare un fornitore... !", "Gestione Polveri", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                            return;
                        }

                        data.ID = base.Current.ID;
                        data.CodicePolvere = this.dynCodicePolvereTextBox.Text;
                        data.Descrizione = this.dynDescrizioneTextBox.Text;
                        data.Note = this.dynNoteTextBox.Text;
                        data.Fornitore = (Fornitore)this.dynCmbFornitori.SelectedValue;
                        data.ScortaMinima = (string.IsNullOrWhiteSpace(this.dynScortaMinima.Text) ? 0 : double.Parse(this.dynScortaMinima.Text));
                        data.IsCodiceCustom = dynChkIsCodiceCustom.Checked;
                        data.TipologiaSM = (TipologiaScortaMinima)dynCmbTipologiaSMP.SelectedValue;

                        if (data.IsCodiceCustom)
                        {
                            if (!data.CodicePolvere.StartsWith("XXXX"))
                            {
                                data.CodicePolvere = "XXXX " + data.CodicePolvere;
                            }
                        }

                        impf.Modify(data);

                        //this.ShowNotBlockingMessage("Dati in aggiornamento", MessageBoxIcon.None);
                        LoadData();
                        //this.ResetNotBlockingMessage();
                    }
                    break;
                case Actions.Delete:
                    {
                        data.ID = base.Current.ID;

                        MovimentiFacade mf = new MovimentiFacade();
                        List<Movimento> m_movimenti = mf.GetMovimentoByPolvere(e.Item.ID);

                        if ((m_movimenti != null) && (m_movimenti.Count() > 0))
                        {
                            MessageBox.Show("Cancellazione Annullata ! La polvere che vuoi cancellare è stato utilizzata in alcuni movimenti di carico.", "Gestione Polveri",
                                MessageBoxButtons.OK, MessageBoxIcon.Warning);

                            return;
                        }

                        ComposizioneColoreFacadeExt ccfExt = new ComposizioneColoreFacadeExt();
                        List<ComposizioneColoreExt> composizioni = ccfExt.GetByPolvere(data.ID);
                        if ((composizioni != null) && (composizioni.Count() > 0))
                        {
                            //if (MessageBox.Show("La polvere che vuoi cancellare è stato utilizzata nella composizione di alcuni colori. Vuoi Procedere ugualmente ?", "Gestione Polveri",
                            //    MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == System.Windows.Forms.DialogResult.No)
                            //{
                            //    return;
                            //}

                            MessageBox.Show("Cancellazione Annullata ! La polvere che vuoi cancellare è stato utilizzata in una formula di composizione colori.", "Gestione Polveri",
                                             MessageBoxButtons.OK, MessageBoxIcon.Warning);

                            return;
                        }

                        /* 
                         * Verifica se sono presenti riferimenti alla polvere in 
                         * OrdersDates e Prenotazioni
                         */
                        OrdersDatesFacade odf = new OrdersDatesFacade();
                        if (odf.CheckOpenOrder(data.ID))
                        {
                            MessageBox.Show("Cancellazione Annullata ! La polvere che vuoi cancellare è presente in un ordine aperto.", "Gestione Polveri",
                                            MessageBoxButtons.OK, MessageBoxIcon.Warning);

                            return;
                        }

                        PrenotazioniFacade pf = new PrenotazioniFacade();
                        if (pf.CheckPrenotazione(data.ID))
                        {
                            MessageBox.Show("Cancellazione Annullata ! La polvere che vuoi cancellare è presente in una prenotazione non annullata.", "Gestione Polveri",
                                           MessageBoxButtons.OK, MessageBoxIcon.Warning);

                            return;
                        }
                        /* --- */



                        impf.Transact(() =>
                        {
                            if (composizioni != null)
                            {
                                foreach (ComposizioneColoreExt ccExt in composizioni)
                                {
                                    ccfExt.Delete(ccExt);
                                }
                            }

                            impf.Delete(data);
                        });

                        //this.ShowNotBlockingMessage("Dati in aggiornamento", MessageBoxIcon.None);
                        LoadData();
                        //this.ResetNotBlockingMessage();

                        ClearControls(this.Controls);
                    }
                    break;
                default:
                    break;
            }

            // richiama il metodo di refresh delle liste del filtro...
            this.Filter.RefreshData();
        }

        void Anagrafica_ItemSelected(object sender, CustomEventArgs<Polvere> e)
        {
            base.Current = e.Item;

            this.dynCodicePolvereTextBox.Text = e.Item.CodicePolvere;
            this.dynDescrizioneTextBox.Text = e.Item.Descrizione;
            this.dynNoteTextBox.Text = e.Item.Note;
            this.dynScortaMinima.Text = e.Item.ScortaMinima.ToString();
            this.dynChkIsCodiceCustom.Checked = e.Item.IsCodiceCustom;

            this.SelectComboItem(this.dynCmbFornitori, e.Item.Fornitore.Descrizione);
            this.SelectComboItem(this.dynCmbTipologiaSMP, e.Item.TipologiaSM.Codice);
        }

        public override void OnFilterExecuted()
        {
            base.OnFilterExecuted();

            this.IsFiltering = true;

            ManageData();
        }

        public override void OnFilterReset()
        {
            base.OnFilterReset();

            this.IsFiltering = false;

            ManageData();
        }
    }

    //public class AnagraficaPolveri2Base : AnagraficaManager<Polvere> { }

    //public class AnagraficaPolveri2Base : AnagraficaManagerObjectListView<Polvere> { }

    public class AnagraficaPolveri2Base : AnagraficaManagerFilteredObjectListView<Polvere, 
                                         GestionePolveri2.Filters.AnagraficaPolveriFilter, 
                                         GestionePolveriLib.BL.FilterBags.AnagraficaPolveriFilterBag> { }
}
